home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Applications / Portable Patmos / src / portable kernel / mac / mmap.c < prev    next >
Encoding:
Text File  |  1995-02-11  |  1.5 KB  |  65 lines  |  [TEXT/KAHL]

  1. caddr_t mmap(caddr_t caddr, size_t size, int prot, int flags, int fd, off_t pos)
  2.     {
  3.     long level2;
  4.     long laddr = (long)caddr;
  5.     /*
  6.      * Make sure one of the sharing types is specified
  7.      */
  8.     int mtype = MAP_FILE; /*    flags & MAP_TYPE;    */
  9.     errno = EINVAL;
  10.     switch (mtype) {
  11.     case MAP_FILE:
  12.         if ((fd<0)||(fd>OPEN_MAX)||!crp->fd_tab[fd]) return((caddr_t)-1);
  13.         if (lseek(crp->fd_tab[fd], pos, SEEK_SET) < 0)
  14.             return((caddr_t)-1);
  15.         kprintf("File ");
  16.         break;
  17.     case MAP_ANON:
  18.         kprintf("Anon ");
  19.         break;
  20.     default:
  21.         return((caddr_t)-1);
  22.     }
  23.     kprintf("mmap(%8X,%8X,%8X,%8X,%8X,%8X);\n", laddr, size, prot, flags, fd, pos);
  24.     /*
  25.      * Address (if FIXED) must be page aligned.
  26.      * Size is implicitly rounded to a page boundary.
  27.      */
  28.     if ((flags & MAP_FIXED) && (laddr & (page_size-1)) || size < 0)
  29.         {
  30.         return((caddr_t)-1);
  31.         }
  32.  
  33.     if (laddr == 0 && (flags & MAP_FIXED) == 0)
  34.         {
  35.         laddr = stack_limit>>2;
  36.         }
  37.  
  38.     for (level2 = laddr/(1<<18); level2 < 128; level2++)
  39.         {
  40.         long addr;
  41.         for (addr = (laddr&((1<<18)-1))/page_size; addr < (1<<18)/page_size; addr++)
  42.             {
  43.             if (!crp->level3[level2][addr])
  44.                 {
  45.                 long page = page_alloc();
  46.                 if (page) crp->level3[level2][addr] = 0x39 + page;
  47.                 else return ((caddr_t)-1);
  48.                 }
  49.             if (mtype == MAP_FILE)
  50.                 {
  51.                 char *kbuf = (char *)(crp->level3[level2][addr]&~(page_size-1));
  52.                 long actual = read(crp->fd_tab[fd], kbuf, page_size);
  53. //                if (actual < 0) return((caddr_t)-1);
  54.                 }
  55.             size -= page_size;
  56.             if (((long)size) < 0) 
  57.                 {
  58.                 return ((caddr_t)laddr);
  59.                 }
  60.             }
  61.         }
  62.         return((caddr_t)-1);
  63.     }
  64.  
  65.